#include <stdint.h>
#include <string.h>
#include <stdarg.h>

#include "patch.stdio.h"


const char* sscan_int(const char *str, int *pvar) {
	if(!str || !pvar) { return NULL; }
	const char *pstr = str;
	
	int begin = 0;
	for(; *str != '\0'; str++) {
		if(!begin) {
			// 遇到非数字，跳过
			if(*str < '0' || *str > '9') { continue; }
			// 开始
			begin = 1;
			// 第一位数字
			*pvar = (*str) - '0';
			// 如果数字前面有一个负号，则值要设置为负数
			if(*(str-1) == '-' && str > pstr) { *pvar = -(*pvar); }
		} else {
			// 遇到非数字，结束
			if(*str < '0' || *str > '9') { break; }
			// 重新计算值
			*pvar = ((*pvar) > 0) ? ((*pvar) * 10 + ((*str) - '0')) : ((*pvar) * 10 - ((*str) - '0'));
		}
	}
	
	return str;
}

int sscanf2(const char *str, const char *fmt, ...) {
	if(!str || !fmt) { return 0; }
	
	// 已成功扫描的参数个数
	int n = 0;
	// 定义一个va_list类型的变量，用来储存单个参数
	va_list args;
	// 使args指向可变参数的第一个参数
    va_start(args, fmt);
	// 根据格式字符串，处理参数
	while((fmt = strstr(fmt, "%d")) != NULL) {
		fmt += 2;
		// 取得下一个参数并转换为指定类型
		int *pvar = va_arg(args, int*);
		// 为参数赋值
		str = sscan_int(str, pvar);
		if(!str) { break; }
		// 参数个数加1
		n++;
	}
	// 结束可变参数的获取
    va_end(args);												
	
	return n;
}
